package com.jh.netty.hj2122017;

import java.util.HashMap;
import java.util.Map;

/**
 * 数据段结构
 */
public class Instruction {

    /**
     * 请求编码 长度=20
     * 精确到毫秒的时间戳:QN=YYYYMMDDhhmmsszzz，用来唯一标识一次命令交互
     * 类型=字符
     */
    public String QN;

    /**
     * 系统编码
     */
    public String ST;

    /**
     * 命令编码
     */
    public String CN;

    /**
     * 访问密码
     */
    public String PW;

    /**
     * 设备唯一标识
     * MN=设备唯一标识，这个标识固化在设备中，用于唯一标识一个设备。
     * MN 由 EPC-96 编码转化的字符串组成，即 MN 由 24 个 0~9，A~F 的字符组成
     *
     */
    public String MN;

    /**
     * 拆分包及应答标志
     *
     */
    public String Flag;

    /**
     * 总包数 类型=字符 长度=9
     * PNUM 指示本次通信中总共包含的数据包
     * 注：不分包时可以没有本字段，与标志位有关
     */
    public String PNUM;

    /**
     * 包号 类型=字符 长度=8
     * PNO 指示当前数据包的包号
     * 注：不分包时可以没有本字段，与标志位有关
     */
    public String PNO;

    /**
     * 指令参数 类型=字符  长度 0<=n<=950
     * CP=&&数据区&&
     */
    public String CP;

    /**
     * @deprecated
     */
    @Deprecated
    public String DataTime;

    /**
     * 其他数据
     */
    public Map<String, String> otherData;

    public static Instruction from(String insStr) {

        String dataStr = insStr.substring(6, insStr.length() - 14);
        dataStr = dataStr.replaceFirst("CP=&&", "CP=&&;");

        String[] props = dataStr.split(";");

        Map<String, String> map = new HashMap<>();
        for (String p : props) {
            String[] arr = p.split(",");

            for (String p1 : arr) {
                String[] ss = p1.split("=");
                map.put(ss[0], ss[1]);
            }
        }

        Instruction ins = new Instruction();
        ins.CN = map.remove("CN");
        ins.QN = map.remove("QN");
        ins.CP = map.remove("CP");
        ins.ST = map.remove("ST");
        ins.PW = map.remove("PW");
        ins.MN = map.remove("MN");
        ins.Flag = map.remove("Flag");
        ins.DataTime = map.remove("DataTime");
        ins.otherData = map;

        return ins;
    }
}
